import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 马拉圈
 * Date: 2023-03-06
 * Time: 10:30
 */
public class SelectJdbc {

    //下面的操作的作用类似于C语言的文件操作
    //Java是将数据放进数据库的！！！
    //因为放进文件里的数据一定是要有格式的
    //数据库在这里作用更加鲜明


    //完全可以做成方法方便重复使用！！！
    //看成整体的读/写操作！！！！


    //下面是读操作！！！
    //下面的操作是在库已存在还有表已存在的 ******************
    public static void main(String[] args) throws SQLException {

        //创建并初始化数据源
        DataSource dataSource = new MysqlDataSource();

        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/" +
/*这里java107含义是数据库名*/"java107?characterEncoding=utf8&useSSL=false");

        ((MysqlDataSource)dataSource).setUser("root");
        //填这个默认到结合上面可以联系到本机的数据库
        //这样构造出来的连接器就是本机数据库的连接器了

        ((MysqlDataSource)dataSource).setPassword("密码");
        //这是我的密码，决定进不进的去


        //上面的这种方法效率高且安全！反射的方法反之
        //有一个池（预 存提高效率），每次在里面取，这样效率提高

        //根据数据源构造链接，之后通过这个连接器就可以改变数据库了
        Connection connection = dataSource.getConnection();


        //构造SQL ---对SQL数据库，进行操作
        String sql = "select * from student";//sql语句


        //通过连接器将sql语句们  变化打包  为“准备状态”
        PreparedStatement statement = connection.prepareStatement(sql);


        //执行sql，将准备状态的推送到mysql里

        //select语句返回临时表(符合我们心意的表)
        ResultSet resultSet = statement.executeQuery();
        System.out.println(resultSet.getInt("id"));
        //遍历这个临时表，本身可以看成迭代器
        while(resultSet.next()) {
            //想象一个东西，一个指针指向表头（之前，可以理解为带头链表的头）
            // 在此时不为空的情况下，每次调用next都会向下走一行，（返回true）
            // 如果跳了之后指向空，则停止（返回false）
            //用getXXX获取当前行的数据信息
            int id = resultSet.getInt("id");
            //用列名为参数比较好，下标的话我们还得自己去数
            String name = resultSet.getString("name");
            System.out.println(id + " " + name);
        }

        //释放资源 --- 客户端不要占位影响服务器工作！！！


        //先建立的后释放
        resultSet.close();
        statement.close();
        connection.close();
        //dataSource 这个只是锁定数据库的构造器罢了
        //不给服务器负担
    }
}
